Service Catalogで製品のマルチアカウント、マルチリージョン共有をやってみた
はじめに
Service CatalogはCloudFormationテンプレートをパッケージングして、AWSリソースの展開ができるサービスです。CloudFormationテンプレートのパッケージングした単位をService Catalogでは「製品」と呼んでいます。また、製品をまとめたものを「ポートフォリオ」と呼び、この単位で特定のユーザーへアクセス許可を与えたり、利用時の制約を設定できたりします。
単一アカウントだけでなく、複数アカウントへ展開したいケースもあります。そのときはポートフォリオの共有機能を使うことで、複数アカウントに共有できました。
参考:【Service Catalog】組織内にポートフォリオを共有してメンバーアカウントから製品を起動してみた | DevelopersIO
これだと単一リージョンへの共有はできるのですが、マルチリージョンに製品を展開したい場合は、リージョン分同じ作業が必要です。そんなケースに対応できそうなAWSブログがあったので試してみました。
やってみる
先ほど紹介したAWSブログを参考に実施します。Service Catalogにはマルチリージョンにポートフォリオを共有する機能はないので、StackSetsを使ってポートフォリオの作成と共有を行います。
ざっくりですが、理解を深めるために構築できる環境を図にしました。(見づらくごめんなさい…別タブで画像開いてみてください。)
ぱっと見は複雑ですが、構築しながら1つ1つ確認すれば難しくはない(はず)です。また、参考にした手順は非Organizations環境でを想定して作成されていますが、わかりやすくするため以下の呼称で進めます。
- ポートフォリオの共有元:管理アカウント
- ポートフォリオの共有先:メンバーアカウント
【管理アカウント】ポートフォリオの作成
まずはService Catalogの管理アカウント側にハブとなるポートフォリオを作成していきます。
ステップ 1: CloudFormation StackSet ロールをセットアップする
まずはStackSetsを利用するためのロールを管理アカウントに作成します。以下ブログのクイック作成リンクを使うと簡単に作成できます。
StackSets用IAM Roleのクイック作成リンク作ってみた | DevelopersIO
「管理側I作成」と「ターゲット側作成」2つとも管理アカウント上に作成してください。
ステップ 2: S3 バケットを作成し、製品の CloudFormation テンプレートをアップロードする
次にCloudFormationテンプレートをS3バケットにアップロードしていきます。まずこちらのテンプレートsc-emr-ra.json
を保存しておきましょう。
お好みの名前でS3バケットを作成してください。今回はservice-catalog-product-bucket-{アカウントID}
で作成しました。
作成したバケットに先ほどのCloudFormationテンプレートをアップロードしてください。オブジェクトURL
を後で使用するため控えておきましょう。
ステップ 3: CloudFormation StackSets を実行して、ハブの AWS アカウントにハブポートフォリオをセットアップする
次に複数リージョンでポートフォリオを作成していきます。以下のリンクをクリックするとポートフォリオを作成するためのテンプレートblog-part1.yml
がダウンロードできます。
CloudFormationのコンソールからStackSetsを開いて「StackSetsの作成」をクリックします。
テンプレートの選択画面は以下のように入力してください。
- IAMロール名:
AWSCloudFormationStackSetAdministrationRole
- テンプレートの指定:テンプレートファイルのアップロード
- ファイルの選択→blog-part1.ymlをアップロード
上記入力できたら次へ進みます。
StackSet の詳細を指定では以下のように入力します。
- StackSet 名:StackSets-Portfolio-Sample(お好みで変更して下さい)
- パラメータ
- EMRCFNPath
- 先ほどS3へアップロードしたテンプレートのS3 URI
- SpokeAccountID
- ポートフォリオを共有したいアカウントID
- EMRCFNPath
デプロイオプションの設定は、バージニア北部(us-east-1)とオハイオ(us-east-2)リージョンに展開するよう設定します。
- アカウント
- アカウント番号:管理アカウントID
- リージョンの指定
- バージニア北部
- オハイオ
他はデフォルトで作成してください。ステータスがSUCCEEDED
になれば完了です。
バージニア北部とオハイオリージョンのコンソールからCloudFormationのスタックを確認してください。新規作成されたスタックの出力タブにPortfolioID
とProductID
が記載されているので、2リージョンとも値を控えておきましょう。
ここまでで、管理アカウント側の2リージョンポートフォリオの作成とメンバーアカウントへの共有までできました。
【メンバーアカウント】ポートフォリオの作成
次にメンバーアカウントに共有されたポートフォリオの製品を取得して、制約やアクセス許可を追加したポートフォリオを作成します。ここからは共有先として指定したアカウントで実施してください。
ステップ 1.StackSet ロールを設定する
管理アカウントで行なったようにStackSets用のIAMロールを作成します。
StackSets用IAM Roleのクイック作成リンク作ってみた | DevelopersIO
「管理側I作成」と「ターゲット側作成」2つとも作成してください。ターゲット側のテンプレートで入力するアカウントIDは実行しているアカウントIDを入力してください。
ステップ 2.ポートフォリオをセットアップする
次にポートフォリオをインポートするためのCloudFormationテンプレートをStackSetsで展開します。
以下のリンクからテンプレート(blog-part2.yml)をダウンロードしてください。
ダウンロードできたら、ファイルを開いて以下の部分を修正します。
- CostCenter
- UPDATE_ACCOUNT_ID_HERE:実行するアカウントID
- UPDATE_COST_CENTER_HERE:お好みで(そのままでも動作確認はできます。)
- PortfolioID
- 管理アカウント側のスタック出力で確認したPortfolioID
- EMRProductID
- 管理アカウント側のスタック出力で確認したProductID
Mappings: CostCenter: "UPDATE_ACCOUNT_ID_HERE": ID: "UPDATE_COST_CENTER_HERE" PortfolioID: us-east-1: "ID": "UPDATE_US-EAST-1-PORTFOLIO_ID_HERE" us-east-2: "ID": "UPDATE_US-EAST-2-PORTFOLIO_ID_HERE" EMRProductID: us-east-1: "ID": "UPDATE_US-EAST-1-PRODUCT_ID_HERE" us-east-2: "ID": "UPDATE_US-EAST-2-PRODUCT_ID_HERE"
上記の変更ができたら保存しましょう。
あとは管理アカウント側と同じように、StackSetsでバージニア北部とオハイオにスタックを展開していきます。
CloudFormationのコンソールからStackSetsを開いて「StackSetsの作成」をクリックします。
テンプレートの選択画面は以下のように入力してください。
- IAMロール名:
AWSCloudFormationStackSetAdministrationRole
- テンプレートの指定:テンプレートファイルのアップロード
- ファイルの選択→blog-part2.ymlをアップロード
StackSet の詳細を指定では以下のように入力します。
- StackSet 名:Sample-Spoke-Portfolio(お好みで変更して下さい)
- パラメータ
- IAMGroupName
- ポートフォリオへのアクセス許可を与えたいIAMグループ名
- IAMGroupName
デプロイオプションの設定は、バージニア北部(us-east-1)とオハイオ(us-east-2)リージョンに展開するよう設定します。
- アカウント
- アカウント番号:メンバーアカウントID
- リージョンの指定
- バージニア北部
- オハイオ
他はデフォルトのまま作成しましょう。これでメンバーアカウント側の新規ポートフォリオの作成は完了です。
Service Catalogのポートフォリオを確認してみると、ローカルのタブには新規で作成した「Sample-Spoke-Portfolio」が確認できます。管理アカウントから共有したポートフォリオは「インポートした」のタブにありました。
バージニア北部とオハイオどちらも同じ設定のポートフォリオが作成できました。
以上で動作確認は終了です。
おわりに
Service Catalogの製品をマルチアカウント×マルチリージョンに展開する方法を試してみました。今回はサンプルで用意されているCloudFormationテンプレートで実施しましたが、これをもとにアレンジして使ってもよさそうです。
今回は1つのアカウントに共有しましたが、Organizations統合でOUへの共有やStackSetsを利用するともう少し楽に展開できると思います。次はOrganizations環境下のマルチリージョン展開を試したいですね。